c++版本的node一直都比python版的麻煩一點,不過大致上的流程是一樣的,也就是先初始化一個node以後,新增一個service的名稱,並為其定義呼叫以後應該要做的function,然後就讓這個node持續運行,當作server使用。
一樣我們先新增一個add_two_ints_server.cpp的檔案:
$ roscd beginner_tutorials/src
$ vim add_two_ints_server.cpp
程式碼流程大致上跟我上面講的一樣:
   1 #include "ros/ros.h"
   2 #include "rospy_tutorials/AddTwoInts.h"
   3 
   4 bool add(rospy_tutorials::AddTwoInts::Request  &req,
   5          rospy_tutorials::AddTwoInts::Response &res)
   6 {
   7   res.sum = req.a + req.b;
   8   ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
   9   ROS_INFO("sending back response: [%ld]", (long int)res.sum);
  10   return true;
  11 }
  12 
  13 int main(int argc, char **argv)
  14 {
  15   ros::init(argc, argv, "add_two_ints_server"); //初始化node
  16   ros::NodeHandle n; // node handler
  17 
  18   ros::ServiceServer service = n.advertiseService("add_two_ints", add); //定義service server以及callback function
  19   ROS_INFO("Ready to add two ints.");
  20   ros::spin(); //持續運行此node
  21 
  22   return 0;
  23 }
這邊我們在第二行的時候新增了一個rospy_tutorials package,所以等一下要去修改CMakeList.txt和package.xml檔,讓系統在編譯的時候可以順利找到這個package/library。
   4 bool add(rospy_tutorials::AddTwoInts::Request  &req,
   5          rospy_tutorials::AddTwoInts::Response &res)
   6 {
   7   res.sum = req.a + req.b;
   8   ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
   9   ROS_INFO("sending back response: [%ld]", (long int)res.sum);
  10   return true;
  11 }
第4~11行定義了我們這個service主要會呼叫的函式,也就是add啦! 這個函式吃兩個參數,分別是Request和Response的物件,這兩個物件分別代表輸入和輸出。從client端收到req後,在第7行做一個加總的動作,把加總結果存在res的sum屬性中。
第18行的advertiseService函式定義如下:
template<class MReq, class MRes>
ros::ServiceServer nh.advertiseService(const std::string& service, <callback>);
基本上就是吃一個service name和callback function囉!
好啦現在程式的部分結束了,接下來就是編譯的部分了。
剛剛上面提到因為我們新增了一個package,所以要去修改CMakeList.txt和package.xml檔的相依模組的部分:
CMakeList.txt: 
package.xml: 
這樣就設定好相依模組囉,接著就是一樣要在CMakeList.txt中將add_two_ints_server.cpp加入編譯中:
add_executable(add_two_ints_server src/add_two_ints_server.cpp)
target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
回到根目錄catkin_ws,執行完catkin_make就編譯完成囉!
執行畫面會長這樣:
可以看到如果我沒給參數的話是沒辦法執行的,一定要給兩個參數他才會進行加總的動作囉!
ROS Tutorials - service in cpp
ROS wiki - roscpp Services